/* ********* number */


let num: number;
let num1: 1;
let num2: -33;
let num3: 2.5;


/* ********* string */


let str: string;
let str1: 'hello';


/* ********* boolean */

let bool: boolean;
let bool1: true;


/* ********* 字面量 */


let gender: 'male' | 'female';
gender = 'male';


/* ********* any */

let anyType: any;

/* ********* unknown */

let unknownType: unknown;

/* ********* void */

function voidType(): void { };

/* ********* never */

function neverType(): never { throw new Error('error') };

/* *********  object 表示一个js对象 */

let a: object;
a = {};
a = function () { };

// {} 用来指定对象中可以包含哪些属性
// 语法：{属性名：属性值,属性名：属性值}
// 在属性名后加？，表示属性是可选的
let b: { name: string, age?: number };
b = { name: 'Alice' };

let c: { name: string, [propName: string]: any };
c = { name: '猪八戒', a: 12, gender: '男' };

/* ********* 设置函数的类型 */
let d: (a: number, b: number) => number;
d = (n1: number, n2: number): number => n1 + n2

/* *********  数组的类型声明： 类型[]  Array<string> 两种 */

// 表示字符串数组
let e: string[]
// 表示数字数组
let f: number[]
let g: Array<number>;

/* ********* 元组，就是固定长度的数组 
      语法：[类型, 类型, 类型]
*/

let h: [string, string];
h = ['hello', 'world'];

/* ********* 枚举 enum */
enum Gender {
    Male = 0,
    Female = 1
}
let i: { name: string, gender: Gender };
i = { name: 'Alice', gender: Gender.Male };

/* ********* | 表示或者  */
/* ********* & 表示同时 */
let j: { name: string } & { age: number };

j = { name: 'Bob', age: 12 };


/* ********* 类型别名  简化类型使用*/
type myType = 1 | 2 | 3 | 4 | 5;
let k: myType;
let l: myType;
// l = 6











